//
//  main.m
//  05-循环遍历
//
//  Created by LL.F on 16/7/8.
//  Copyright © 2016年 LL.F. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
    
    // 对集合中的元素依次取出来叫遍历
    // 练习:
    // 1. 用for循环实现数组倒序输出, 并存入另一个可变数组里
    NSArray *array = [NSArray arrayWithObjects:@"历史", @"语文", @"英语", @"数学", @"地理", nil];
    NSMutableArray *mutableArray = [NSMutableArray array];
    for (NSInteger i = array.count - 1; i >= 0; i--) {
        [mutableArray addObject:array[i]];
    }
    NSLog(@"%@", mutableArray);
    
    // 2. 用for循环定义一个字典,存一个人的name, gender, age的三个数据并完成输出.
    NSDictionary *dic = @{@"name": @"小明", @"gender": @"男", @"age": @18};
    NSArray *allkeysArray = dic.allKeys;
    for (NSInteger i = 0; i < allkeysArray.count; i++) {
        NSString *key = allkeysArray[i];
        id value = [dic objectForKey:key];
        NSLog(@"key = %@, value = %@", key, value);
    }
    
    // 3. 用for...in 完成
    NSArray *stringArray = @[@"光头强", @"许文强", @"李志强", @"小强哥", @"墙根"];
    NSString *newString = [[NSString alloc] init];
    for (NSString *str in stringArray) {
        newString =[newString stringByAppendingString:str];
    }
    NSLog(@"%@", newString);
    
    /********************* 枚举器(遍历方式) ***********************/
    // NSEnumerator依赖于集合类型(数组, 字典, 集合), 不能单独使用
    // 1. 数组的枚举器
    NSEnumerator *stringArrayEnumerator = [array objectEnumerator];
    id value = nil;
    while ((value = [stringArrayEnumerator nextObject]) != nil) {
        NSLog(@"%@", value);
    }
    
    // 倒序枚举
    NSEnumerator *reverse = [array reverseObjectEnumerator];
    id arrayValue = nil;
    while (arrayValue = [reverse nextObject]) {
        NSLog(@"arrayValue = %@", arrayValue);
    }
    
    
    // 2. 字典的枚举器(字典无序 所以没有倒序)
    // 默认取出来的值是 value
    NSEnumerator *dicEnumerator = [dic objectEnumerator];
    id dicValue = nil;
    while (dicValue = [dicEnumerator nextObject]) {
        NSLog(@"value = %@", dicValue);
    }
                             
    // 3. 集合的枚举器(无序 也没有倒序枚举)
    NSSet *set = [NSSet setWithObjects:@"112", @"223", @"555", @"fsd", nil];
    NSEnumerator *setEnumerator = [set objectEnumerator];
    id setValue = nil;
    while (setValue = [setEnumerator nextObject]) {
        NSLog(@"setValue = %@", setValue);
    }
    
    /******************* 快速枚举 *********************/
    // for ... in (是对NSEnumerator的一层封装)
    for (NSString *str in array) {
        NSLog(@"%@", str);
    }
    
    // 快速枚举一个字典
    for (NSString *key in dic) {
        NSLog(@"key = %@", key);
        NSLog(@"value = %@", [dic objectForKey:key]);
    }
    
    // 快速枚举一个集合
    for (NSString *anyObject in set) {
        NSLog(@"%@", anyObject);
    }
    
    // 排序1
    // 参数1 key: 排序条件 参数2 acending: YES(升序) or NO(降序)
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES];
    // 不可变数组有排序的方法（sortedArrayUsingDescriptors）
    // 参数为一个排序条件的数组
    array = [array sortedArrayUsingDescriptors:@[sortDescriptor]];
    NSLog(@"%@", array);
    
    // 可变数组进行排序（sortUsingDescriptors）
    NSMutableArray *mutableArr = [[NSMutableArray alloc] initWithObjects:@"12", @"23", @"34", nil];
    [mutableArr sortUsingDescriptors:@[mutableArr]];
    NSLog(@"%@", mutableArr);
    
    
    // 排序1: 可变数组和不可变数组通过sort排序调用的方法不同
    // 1. 不可变数组, 排序后需要生成新的数组
    // 2. 可变数组, 排序直接可以在本身上进行修改
    
    //例子
    Person *per1 = [[Person alloc]init];
    per1.name = @"昨天";
    per1.age = 18;
    Person *per2 = [[Person alloc] init];
    per2.name = @"今天";
    per2.age = 6;
    Person *per3 = [[Person alloc] init];
    per3.name = @"明天";
    per3.age = 20;
    NSArray *personArray = @[per1, per2, per3];
    NSLog(@"排序前 : %@", personArray);
    // 根据name排序
    NSSortDescriptor *perSort = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
    personArray = [personArray sortedArrayUsingDescriptors:@[perSort]];
    NSLog(@"%@", personArray);

    // 根据age排序
    NSSortDescriptor *perSortAge = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
    personArray = [personArray sortedArrayUsingDescriptors:@[perSortAge]];
    NSLog(@"%@", personArray);
    
    
    // 排序2(选择器）
    // 1. 不可变数组（sortedArrayUsingSelector）
    NSArray *sortByString = @[@"iPhone", @"iPad", @"iTouch", @"iMac", @"Mac-mini"];
    sortByString = [sortByString sortedArrayUsingSelector:@selector(compare:)];
    NSLog(@"%@", sortByString);
    // 2.可变数组 （sortUsingSelector）
    NSMutableArray *mutableSortByString = [[NSMutableArray alloc] initWithObjects:@"12", @"53", @"34", nil];
    [mutableSortByString sortUsingSelector:@selector(compare:)];
    NSLog(@"%@", mutableSortByString);

    
    return 0;
}
